package com.cg.offer;

import org.junit.Test;

/**
 * 剑指Offer 16.数值的整数次方
 *
 * @program: LeetCode->Offer_16
 * @description: 剑指Offer 16.数值的整数次方
 * @author: cg
 * @create: 2022-03-28 21:36
 **/
public class Offer_16 {

    @Test
    public void test16() {
        System.out.println(myPow(2.0000, -2147483648));
    }

    /**
     * 实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，xn）。不得使用库函数，同时不需要考虑大数问题。
     * <p>
     * 示例 1：
     * 输入：x = 2.00000, n = 10
     * 输出：1024.00000
     * <p>
     * 示例 2：
     * 输入：x = 2.10000, n = 3
     * 输出：9.26100
     * <p>
     * 示例 3：
     * 输入：x = 2.00000, n = -2
     * 输出：0.25000
     * 解释：2的-2次幂 = 1/2的2次幂 = 1/4 = 0.25
     * <p>
     * 提示：
     * -100.0 < x < 100.0
     * -2的31次幂 <= n <= 2的31次幂-1
     * -10次幂4 <= x次幂n <= 10次幂4
     *
     * @param x
     * @param n
     * @return
     */
    public double myPow(double x, int n) {
        if (x == 0) {
            return 0;
        }
        long b = n;
        double res = 1.0;
        if (b < 0) {
            x = 1 / x;
            b = -b;
        }
        while (b > 0) {
            if ((b & 1) == 1) {
                res *= x;
            }
            x *= x;
            b >>= 1;
        }
        return res;
    }

}
